package com.itheima.aop;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

/**
 * 通知类
 * @author 黑马程序员
 * @Company http://www.ithiema.com
 * @Version 1.0
 *   @Component 是组件 交给spring管理
 *   @Aspect  配置切面
 */
@Component
@Aspect
public class AopAdvice {
    /**
     * execution( void com.itheima.service.impl.UserServiceImpl.save(com.itheima.domain.User))
     * execution 切入点表达式
     *     修饰符 返回值  包.类.方法名(参数列表类型)
     *     修饰符 可写可不写
     *      * *..*.*(..)
     */

//    设置连接点 上有切入点
    @Pointcut("execution( * com.itheima.service.impl.*.*(..))")
    public void pc(){}

////    配置 切口位置  @Before
//    @Before("pc()")
//    public void before(){
//        System.out.println("当前方法执行前初始时间毫秒值是:"+System.currentTimeMillis());
//    }
//    @After("pc()")
//    public void after(){
//        System.out.println("当前方法执行后初始时间毫秒值是:"+System.currentTimeMillis());
//    }

//    // 返回后通知
//    @AfterReturning("pc()")
//    public void afterReturning(){
//        System.out.println("我是返回后通知，你猜我什么时候执行");
//    }
//    // @AfterThrowing
//
//   @AfterThrowing("pc()")
//    public void afterThrowing(){
//        System.out.println("我是异常后后通知，你猜我什么时候执行");
//    }
    @Around("pc()")
    public Object around(ProceedingJoinPoint pjp) throws Throwable {
        long startTime = System.currentTimeMillis();
        System.out.println("当前方法执行前初始时间毫秒值是:"+startTime);
           // 这个就是 被环绕的 需要增强方法
            Object ret = pjp.proceed();
        for (int i = 0; i <10000000 ; i++) {
            String s = "abc";
            String substring = s.substring(0, 1);
            substring.toUpperCase().toLowerCase();
        }
        long endTime = System.currentTimeMillis();
        System.out.println("当前方法执行前结束时间毫秒值是:"+endTime);
        System.out.println("该方法执行的效率是:"+(endTime-startTime));
            return ret;
    }

}
